/*
 * This file is part of LangMan.
 *
 * LangMan is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * LangMan is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with LangMan.  If not, see <http://www.gnu.org/licenses/>.
 */

package langman.business.actions.defaults;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import langman.business.actions.ActionFactory;
import langman.business.actions.common.Action;
import langman.business.actions.common.ActionTypes;
import langman.gui.tree.TreeItemSelectionService;
import langman.util.doping.Inject;
import langman.util.doping.SingletonBean;

@SingletonBean
public class DefaultRemoveAction implements Action {

    private final BooleanProperty possible = new SimpleBooleanProperty();
    private final TreeItemSelectionService selectionService;
    private final ActionFactory actionFactory;


    @Inject
    public DefaultRemoveAction(TreeItemSelectionService selectionService, ActionFactory actionFactory) {
        this.selectionService = selectionService;
        this.actionFactory = actionFactory;

        selectionService.selectedItemProperty().addListener((observableValue, treeItem, newValue) -> {
            possible.unbind();
            if (newValue instanceof RemoveEnabled) {
                Action action = determineAction((RemoveEnabled) newValue);
                possible.bind(action.possibleProperty());
            } else {
                possible.set(false);
            }
        });
    }

    private Action determineAction(RemoveEnabled newValue) {
        ActionTypes addAction = newValue.getRemoveAction();
        return actionFactory.getAction(addAction);
    }


    @Override
    public ReadOnlyBooleanProperty possibleProperty() {
        return possible;
    }

    @Override
    public void perform() {
        Action action = determineAction((RemoveEnabled) selectionService.getSelectedItem());
        if (action != null && action.possibleProperty().get()) {
            action.perform();
        }
    }

    @Override
    public ActionTypes getActionType() {
        return ActionTypes.DefaultRemove;
    }
}
